#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
using namespace std;

int main()
{
    // 1.将文件掩码（umask）设置为0
    umask(0);
    // 2.fork子进程创建新的会话，调用setsid
    if (fork() > 0)
    {
        // father
        exit(0);
    }
    setsid(); // 创建新会话
    // 3.忽略掉子进程发送的信号，SIGCHLD
    signal(SIGCHLD, SIG_IGN);
    // 4.保持子进程自己不是组长，再次fork，孙子进程向后执行
    if (fork() > 0)
    {
        exit(0);
    }
    // 5.改变目录，将标准输入，标准输出，标准错误重定向到 /dev/null 黑洞文件 dup2
    chdir("/");
    int fd = open("/dev/null", O_RDWR);
    dup2(fd, 0); // 新 旧
    dup2(fd, 1);
    dup2(fd, 2);

    while(1);
    return 0;
}